var express = require('express')
var router = express.Router()
const md5 = require('blueimp-md5')  // md5加密插件
// router路由模块

let {UserModel ,ChatModel} = require('../model/model') // 引入数据库user集合
// 指定mongoose的集合find方法过滤的属性
const filter = {password: 0, __v: 0} // 过滤掉password 和 __v

/* GET home page. */
router.get('/', function (req, res, next) {
  console.log('///')
  res.render('index', {title: 'Express'})
})

// 注册路由
router.post('/register', (req, res) => {
  // 拿到 req.body中 的数据
  let {username, password, type} = req.body
  // console.log(req.body)
  if (username === 'admin') {
    res.send({code: 1, msg: 'admin不能注册！'})
    return
  } else {
    // 查询数据库是否有这个username
    UserModel.findOne({username}, (err, data) => {
      if (err) {
        return res.send({code: 1, msg: '操作失败 类型 2'})
        
      } else {
        // 对查询结果进行判断如果没有find到
        if (data) {
          return res.send({code: 1, msg: '用户名已存在'})
        } else {
          let newUser = {
            username, password: md5(password), type,
          }
          // console.log(newUser)
          // 没有此用户名那么可以创建此用户 password用md5加密
          UserModel.create(newUser,
            (err, result) => {
              if (err) {
                res.send({code: 1, msg: '操作失败 类型3'})
              } else {
                // 给客户端设置一个session
                // console.log(result)
                res.cookie('userid', result._id, {maxAge: 1000*60*60*24})
                res.send({
                  code: 0,
                  type,
                  msg: '注册成功',
                  userid:result._id,
                  header: '',
                  password:null
                  
                })
              }
            })
        }
      }
    })
  }
  
})

// 登录路由
router.post('/login', (req, res) => {
  console.log('login')
  // 拿到 req.body中 的数据
  let {username, password} = req.body
  console.log(username, password)
  
  // 查询数据库是否有这个username 需要md5（）函数处理一下password和数据库加密的密码比对
  UserModel.findOne({username, password: md5(password)},  filter, (err, data) => {
    // console.log(data)
    if (err) {
      res.send({code: 1, msg: '操作失败 类型 2'})
    } else {
      // 对查询结果进行判断
      if (data) {
        // 如果find的返回值 不为null 那么匹配到了登录成功
 
        res.cookie('userid', data._id, {maxAge: 1000*60*60*24})
        res.send({
          code: 0,
          userid:data._id,
          msg: '登录成功',
          ...data._doc,
        })
      } else {
        // 返回值null那么登录失败
        res.send({code: 1, msg: '用户名密码错误'})
      }
    }
  })
  
})

// 更新用户信息的路由
router.post('/update', (req, res) => {
  // console.log(req.body)
  const userid = req.cookies.userid
  // console.log(req.session.username)
  // 对是否有用户名进行判断
  if (!userid) {
    // session中没有用户名那么直接跳转到登录页面
    res.send({code:10, msg: '未登录'})
  } else {
    // 拿到post请求的信息 作为要更新的数据对象
    let user = req.body
    // 如果用户名存在那么..找到数据库中username更新数据
    UserModel.findByIdAndUpdate({_id: userid}, user, (err, data) => {
      if (err) {
        res.send({code: 1, msg: '操作失败 错误码1' , })
      } else {
        // console.log(data)
        // let {header ,type , username}  =  data
       UserModel.findOne({_id: data._id} ,(err,result) => {
         res.send({code: 0, msg: '修改成功' , ...result._doc ,   userid:result._id ,password:null})
       })
      }
    })
  }
  
})

// 获取用户信息的路由
router.get('/user', (req,res) => {
  // 获取cookie中的userid 进行判断
  let userid = req.cookies.userid
  // console.log(userid)
  if (!userid) {
    // 如果没有userid 那么返回错误信息
    res.send({code: 1 , msg: '未登录'})
  } else {
  //    通过userid找到 用户信息返回
    UserModel.findById(userid , filter,(err,data) => {
      if (err) {
        res.send({code: 10 , msg: '操作失败'})
      }  else  {
        // console.log(data)
        res.send({code: 0 , ...data._doc, userid})
      }
    })
  }
  
  
})

// 获取指定type的所有用户数组
router.get('/userlist',(req,res) => {
//  获取type
  const {type} = req.query
  // console.log(type)
//  操作数据库
  UserModel.find({type},filter,(err,list) => {
    if (err) {
      res.send({code:1, msg: '失败'})
    } else {
// 成功获取数据库用户列表
      res.send({code:0, list})
    }
  })
  
  
})

// 获取聊天信息路由
router.get('/msglist', (req,res) => {
  let userid = req.cookies.userid // 获取登录的用户的userid
  console.log(userid)
// 需要返回一个所有用户信息的容器对象 ： 包含用户名 和 用户头像 用来在聊天列表中显示 为什么用对象结构？方便直接打点调用对象的属性获取容器中用户的 用户名和 头像， 优化性能
  let users = {} // 定义返回的所有用户信息的对象光荣器
  UserModel.find((err,data) => {
    // console.log(data)
    if (err) {
      res.send({code: 1 , msg: '操作失败'})
    } else {
      data.forEach(value => {
        users[value._id] = {
          username: value.username,
          header: value.header
        }
      })
      console.log(users)
    }
  })
//   获取userid相关的聊天信息 ： userid发给别人的，别人发给userid的 所以查询条件要用$or from ,to
//  也就是说 要将  我发给别人的消息  和 别人发给我的消息 都find一个数组，返回给客户端 (只要from和 to 有一个包含userid都是需要返回的数据)
 ChatModel.find({$or:[{from:userid}, {to: userid}]} ,(err,chatMsg)=> {
   if (err) {
     res.send({code:1, msg : '操作失败'})
   } else  {
     res.send({code:0, data: {chatMsg,users , userid}})
   }
 })
})

// 将消息更新为已读的路由
router.post('/readmsg',(req,res) => {
  let from = req.body.from
  let to = req.cookies.userid
  let condition = {from , to}
  console.log(condition)
  // 更新发送给该登录用户的消息
  ChatModel.updateMany(condition,{read:true}, (err,data) =>{
    if (err)  {
      res.send({code: 1 ,msg: '操作失败'} )
    } else {
      console.log(data)
      res.send({code: 0 ,count: data.nModified} )
    }
  })
})

// ChatModel.updateMany({},{read:false} , (err,data) => {
//   console.log(data)
// })

module.exports = router
